package com.ia2014.tp.portal2.converter;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;

import com.ia2014.tp.portal2.entities.AbstractEntity;
import com.ia2014.tp.portal2.vo.AbstractVO;

//import com.ia2014.tp.portal2.log.Log;

public class ConvVO {

	
	private static Logger logger = Logger.getLogger(ConvVO.class);
	
	public ConvVO(){
		
	}
	
	/**
	 * Convierte de List<AbstractBean> -----> List<AbstractVo>
	 * 
	 * @param <T>
	 *            	extends AbstractVo (cualquier cosa que lo implemente)
	 * @param <F>
	 *            	extends AbstractBean<T>
	 * @param listaBean
	 *            	lista de AbstractBean que le pasan para convertir a lista de VO
	 * @return listaVO 
	 * 				lista de AbstractBean convertidos a VO
	 */
	public static <T extends AbstractVO, F extends AbstractEntity<T>> List<T> getListaVoFromEntity(List<F> listaBean) {
		
		List<T> listaVO = new ArrayList<T>();
		
		if (listaBean != null && listaBean.size() > 0) {
			try{
				Iterator<F> it = listaBean.iterator();

				T vo = null;
			
				while (it.hasNext()) {
				
					vo = ((AbstractEntity<T>) it.next()).getVO();
					
					listaVO.add(vo);
				}
			}
			catch(Exception e){
				//Log.logError(e.getMessage(), "ConvVO.getListaVoFromEntity" );
				
				logger.error("Error la tratar de obtener una lista de VO desde una lista de Entities");
				logger.error(e.toString());
				logger.debug("Stacktrace", e);
			}

		}
		return listaVO;
	}

	/**
	 * Convierte de List<AbstractVo> -----> List<AbstractBean>
	 * 
	 * @param <T>
	 *            	extends AbstractVo (cualquier cosa que lo implemente)
	 * @param <F>
	 *            	extends AbstractBean<T>
	 * @param listaVO
	 *            	lista de VO que le pasan para convertir a lista de AbstractBean
	 * @return listaBean 
	 * 				lista de VO convertidos a AbstractBean
	 */

	@SuppressWarnings("unchecked")
	public static <T extends AbstractVO, F extends AbstractEntity<T>> List<F> getListaEntityFromVo(List<T> listaVO) {
		List<F> listaBean = new ArrayList<F>();
		
		if (listaVO != null && listaVO.size() > 0) {
			
			Iterator<T> it = listaVO.iterator();
			
			Class<? extends F> clase = null;
			
			clase = AsociacionVoBeanFactory.getBeanClassFromVo(listaVO.get(0).getClass());
			
			while (it.hasNext()) {
				try {
					
					F bean = clase.newInstance(); 
					
					bean.setVO(it.next());
					
					listaBean.add(bean);
					
				} catch (Exception e) {
					
					//Log.logError(e.getMessage(), "ConvVO.getListaEntityFromVo" );
					
					logger.error("Error la tratar de obtener una lista de Entities desde una lista de VO");
					logger.error(e.toString());
					logger.debug("Stacktrace", e);
				}	
				
			}
		}
		
		return listaBean;
	}
	
	
	public static <T extends AbstractVO, F extends AbstractEntity<T>> List<F>	getListaPreciosBeanFromVo(List<T> listaVO) {
			return getListaEntityFromVo(listaVO);
	}
}
